#!/usr/bin/env python3
# -*- coding:UTF-8 -*-
#现代操作系统不允许直接操作硬盘上的文件，因此读写文件需要通过操作系统。
#操作系统一般会给一个文件描述符
#程序通过这个文件描述符来操作文件

import re
from io import StringIO
import os
import pickle
import json
# 1. 打开文件
myfile = open("liwanliang.txt",'r') #打开文件操作，应该在try...except操作之前
try:
    #print("只读打开文件正常")
    print(myfile.read())
except:
    print("只读文件打开文件，因为文件不存在，因此报出异常")
myfile.close()
#一旦文件打开出错，f.close就不会出错，因此需要正确使用try.except.
#方式一：
try:
    myfile = open("liwanliang.txt",'r')
    print(myfile.read())
finally:
    if myfile:
        myfile.close()
#方式二:
with open("liwanliang.txt",'r') as myfile:
    #print(myfile.read())
    for line in myfile.readlines():
        print(line.strip())
        #print(re.findall(r'liwl',line.strip()))
#文件读取方法：
#read() 读取全部内容
#read(size) 读取指定大小字节的内容
#readline() 读取一行内容
#readlines() 一次读取所有内容，并按行返回list,一般用于配置文件

#写文件
with open("liwl.txt",'w') as myfile:
#with open("liwanliang.txt",'a') as myfile: #追加文本
    myfile.write("ok,I am fine.")
    myfile.close()

#IO是一个既简单又宽泛的概念。简答解释就是读写，但是读写对象不通。
#如果是相对于内存来说，那么文件，进程，网络流，数据库等均是读写对象

#StringIO 内存读写模块,操作对象是字符串
#StringIO写
ywnote001 = StringIO()
#f.write("hello") #写入操作，返回写进内存的字符数目
print(ywnote001.write("yunweinote"))
print(ywnote001.getvalue())
#StringIO读
ywnote002 = StringIO("Hello,Yunweinote002\nI am Yunweinote.\nGoodbye\n")
while True:
    line = ywnote002.readline()
    if line == '':
        break
    print(line.strip())
#ByteIO 内存读写模块，操作对象是二进制
#文件操作，同样可以通过操作系统提供的命令来操作，python提供了调用操作系统命令的库os
print(os.name)
#print(os.uname()) #在Linux上提供的模块
#print(os.path.abspath())

#序列化:变量从内存中可变成可存储或者传输的过程称之为序列化，python中叫做pickling
#序列化之后，就可以把序列化的内容，写入本地磁盘，通过网络写入到远程磁盘(即远程主机)
#反过来，把变量内容从序列化对象读到内存中的过程，叫做反序列化
#python提供了pickle模块实现序列化
people = dict(name="yunweinote",age=28,sex='M')
#pickle.dumps(people)
print(pickle.dumps(people))
myfile01 = open("myfile01.txt","wb")
pickle.dump(people,myfile01) #通过pickle.dump函数，将序列化以字节形式写入文件
myfile01.close() #
myfile02 = open("myfile01.txt","rb")
print(pickle.load(myfile02))
myfile02.close()

#序列化应用 JSON

myinfo01 = dict(name="liwanliang01",age=28,sex='M')
print(type(json.dumps(myinfo01)))
print(json.dumps(myinfo01))
myjsonstr = '{"name":"liwanliang","age":"28","sex":"M"}'
print(json.loads(myjsonstr))

#python 字典的json序列化
class YunweinoteA(object):
    def __init__(self,name,age,score):
        self.name = name
        self.age = age
        self.score = score
myinfo02 = YunweinoteA("liwanliang",28,100)
try:
    print(json.dumps(myinfo02))
except:
    print("错误")
def object2json(obj):
    return {
        'name':obj.name,
        'age':obj.age,
        'score':obj.score
    }
print(json.dumps(myinfo02,default=object2json))
myinfo03 = YunweinoteA("liwl",29,99)
print(json.dumps(myinfo03,default=lambda obj:obj.__dict__))